package com.vo;

import java.io.Serializable;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

/**
 *  Classe Note utilizada como Variable Object.
 * @author Jean Vasconcelos, Carla Sukeyosi, Matheus Emanuel, Heitor Carvalho
 */
public class Note implements Serializable
{
    private String title;
    private String body;
    private Calendar date;
    private List<URL> audioList;
    private List<URL> imagesList;
    private List<URL> videosList;

    //construtor
    public Note() 
    {
        this.date = Calendar.getInstance();
        this.audioList = new ArrayList<URL>();
        this.imagesList = new ArrayList<URL>();
        this.videosList = new ArrayList<URL>();
    }
    
    /**
     * Recupera um Calendar que representa a data de criação da Anotação.
     * @return Calendar da data de criação da Anotação.
     */
    public Calendar getDate()
    {
        return date;
    }
    
    /**
     * Recupera todas as URLs(de videos, de imagens e de audios) associadas a 
     * Anotação.
     * @return Lista<URLs> das multimidias.
     */
    public List<URL> getURLs ()
    {
        List<URL> lists = audioList;
        lists.addAll(imagesList);
        lists.addAll(videosList);
        return lists;
    }
    
    /**
     * Adiciona um audio(URL) a listaAudios<URL> da Anotação.
     * @param audio Audio(URL) a ser adicionado.
     * @return true se o elemento for adicionado a lista.
     */
    public boolean addAudio (URL audio)
    {
        return this.audioList.add(audio);
    }
    
    /**
     * Adiciona um video(URL) a listaVideos<URL> da Anotação.
     * @param video Video(URL) a ser adicionado.
     * @return true se o elemento for adicionado a lista.
     */
    public boolean addVideo (URL video)
    {
        return this.videosList.add(video);
    }
    
    /**
     * Adiciona uma imagem(URL) a listaImagens<URL> da Anotação.
     * @param image Imagem(URL) a ser adicionada.
     * @return true se o elemento for adicionado a lista.
     */
    public boolean addImage (URL image)
    {
        return this.imagesList.add(image);
    }

    /**
     * Recupera a listaAudios<URLs> da Anotação.
     * @return ListaAudios<URLs> da Anotação.
     */
    public List<URL> getAudioList() 
    {
        return audioList;
    }

    /**
     * Recupera a listaImagens<URLs> da Anotação.
     * @return ListaImagens<URLs> da Anotação.
     */
    public List<URL> getImagesList() 
    {
        return imagesList;
    }

    /**
     * Recupera a listaVideos<URLs> da Anotação.
     * @return ListaVideos<URLs> da Anotação.
     */
    public List<URL> getVideosList() 
    {
        return videosList;
    }
    
    /**
     * Recupera o corpo da Anotacão.
     * @return Corpo da Anotação.
     */
    public String getBody() 
    {
        return body;
    }
    
    /**
     * Altera o corpo da Anotacao.
     * @param body Novo corpo.
     */
    public void setBody(String body) 
    {
        this.body = body;
    }
    
    /**
     * Recupera o titulo da Anotacao.
     * @return Titulo da Anotacao.
     */
    public String getTitle() 
    {
        return title;
    }

    /**
     * Altera o titulo da Anotacao.
     * @param title Novo titulo.
     */
    public void setTitle(String title) 
    {
        this.title = title;
    }
    
    /**
     * Verifica se duas Anotações são iguais, no caso de possuirem o mesmo título
     * e corpo.
     * @param obj Anotação a ser comparada.
     * @return true caso as Anotações sejam iguais.
     */
    @Override
    public boolean equals(Object obj) 
    {
        if (obj == null)
        {
            return false;
        }
        if (getClass() != obj.getClass()) 
        {
            return false;
        }
        final Note other = (Note) obj;
        
        if (other.hashCode() != this.hashCode())
            return false;
        
        return true;
    }
    
    /**
     * Gera o hashcode da Anotação a partir do corpo e título.
     * @return Hashcode da Anotação.
     */
    @Override
    public int hashCode() 
    {
        int hash = 7;
        hash = 17 * hash + (this.title != null ? this.title.hashCode() : 0);
        hash = 17 * hash + (this.body != null ? this.body.hashCode() : 0);
        return hash;
    }
}
